Networks and distributed storage allow data and storage space to be shared between devices located anywhere a connection is available. These implementations may range from a single machine offering a shared drive over a home network to an enterprise-class cloud storage array with multiple copies of data distributed throughout the world. Larger implementations may incorporate Network Attached Storage (NAS) devices, Storage Area Network (SAN) devices, and other configurations of storage elements and controllers in order to provide data and manage its flow. Improvements in distributed storage have given rise to a cycle where applications demand increasing amounts of data delivered with reduced latency, greater reliability, and greater throughput. Building out the storage architecture to meet these expectations enables the next generation of applications, which come with even greater demands.
One technique used in distributed storage is the creation and management of multiple copies of data. This may be known as mirroring. The copies may be used for data backup as well as to improve storage performance. Typically, a controller monitors changes to the data in order to maintain coherency across the mirrors. When changes such as write requests are received, the controller may update the mirrors synchronously (as changes are received) or asynchronously (independent of when the changes are received). Synchronous schemes tend to place more of a burden on the storage devices and their connections and deliver reduced performance in the interest of simplicity. Asynchronous schemes may provide improved performance, but require more careful monitoring of the coherency. In both cases, tracking changes imposes an overhead that delays data requests, consumes bandwidth, and mitigates some of the benefits of mirroring. Thus, while conventional storage management techniques have proved generally adequate, further improvements to reduce management overhead are desirable.